#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    char *const env[] ={
        (char*)"haha=hehe",
        (char*)"PATH=/",
        NULL
    };
    printf("I am a process, pid: %d\n", getpid());
    //putenv("MYVAL=bbbbbbbbbbbbbbbbbbbbbbbbbbbb");
    pid_t id = fork();
    if(id == 0)
    {
        //extern char**environ;
        sleep(1);
        //execle("./mytest", "mytest", NULL, environ); // 我们传递环境变量表了吗？？no. 子进程默认就拿到了.他是怎么做到的？
        execle("./mytest", "mytest", NULL, env); // 我们传递环境变量表了吗？？no. 子进程默认就拿到了.他是怎么做到的？
        //execl("/usr/bin/python3", "python3", "test.py", NULL);
        //execl("/usr/bin/bash", "bash", "test.sh", NULL);
        //execl("./mytest", "mytest", NULL); // 我们传递环境变量表了吗？？no. 子进程默认就拿到了.他是怎么做到的？
        //char *const argv[] = {
        //    (char*)"ls",
        //    (char*)"-a",
        //    (char*)"-l"
        //};
        //sleep(3);
        //printf("exec begin...\n");
        //execvp("ls", argv);
        //execv("/usr/bin/ls", argv);
        //execl("/usr/bin/ls", "ls", "-a", "-l", NULL); //NULL 不是 "NULL"
        //execlp("ls", "ls", "-a", "-l", NULL); //NULL 不是 "NULL"
        //execl("/usr/bin/top", "/usr/bin/top", NULL); //NULL 不是 "NULL"
        printf("exec end ...\n");
        exit(1);
    }

    pid_t rid = waitpid(id, NULL, 0);
    if(rid > 0)
    {
        printf("wait success\n");
    }
    
    exit(1);
}


// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         // child
//         int cnt = 5;
//         while(cnt)
//         {
//             printf("Child is running, pid: %d, ppid: %d\n", getpid(), getppid());
//             sleep(1);
//             cnt--;
//         }
//         exit(1);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0); // 阻塞等待
//     if(rid > 0)
//     {
//         printf("wait success, rid: %d, status: %d, exit signo: %d, exit code: %d\n", rid, status, status&0x7F, (status >> 8)&0xFF);
//     }

// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         // child
//         int cnt = 5;
//         while(cnt)
//         {
//             printf("Child is running, pid: %d, ppid: %d\n", getpid(), getppid());
//             sleep(1);
//             cnt--;
//         }
//         exit(1);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0); // 阻塞等待
//     if(WIFEXITED(status))
//     {
//         printf("wait success, rid: %d, status: %d, exit code: %d\n", rid, status, WEXITSTATUS(status));
//     }
// 	return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         // child
//         int cnt = 5;
//         while(cnt)
//         {
//             printf("Child is running, pid: %d, ppid: %d\n", getpid(), getppid());
//             sleep(1);
//             cnt--;
//         }
//         exit(1);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, WNOHANG); 
//     while(1)
//     {
//         if(rid > 0)
//         {
//             printf("wait success, rid: %d, status: %d, exit code: %d\n", rid, status, WEXITSTATUS(status));
//             break;
//         }
//         else if(rid == 0)
//         {
//             printf("father say: child is running, do other thing\n");
//         }
//         else
//         {
//             perror("waitpid");
//             break;
//         }
//     }
// 	return 0;
// }

<<<<<<< HEAD
=======

>>>>>>> a13fee9fb32384782c016ccb6510aa2b832d7637
